package com.cmc.cloud.cmclink.doc.service.so;

import com.cmc.cloud.cmclink.doc.entity.SoVslvoyDO;
import com.cmc.cloud.cmclink.doc.vo.sovo.sovslvoyvo.*;
import com.cmes.framework.common.pojo.PageResult;

import javax.validation.Valid;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 订舱航次路径 Service 接口
 *
 * @author 招商轮船-管理员
 */
public interface SoVslvoyService {

    /**
     * 创建订舱航次路径
     *
     * @param createReqVO 创建信息
     */
    void createSoVslvoy(@Valid SoVslvoyCreateReqVO createReqVO);

    /**
     * 创建 修改 删除 订舱航次路径
     *
     * @param soId    soId
     * @param newList 修改
     * @param oldList 原信息
     */
    void createOrUpdateAndDeleteBatch(Long soId, List<SoVslvoyUpdateReqVO> newList, List<SoVslvoyRespVO> oldList);

    /**
     * 创建 修改 删除 订舱航次路径
     *
     * @param soId                         soId
     * @param newList                      修改
     * @param oldList                      原信息
     * @param insertSpaceApproveStatusNull 空值
     */
    void createOrUpdateAndDeleteBatch(Long soId, List<SoVslvoyUpdateReqVO> newList, List<SoVslvoyRespVO> oldList, boolean insertSpaceApproveStatusNull);

    /**
     * 批量创建
     *
     * @param createReqVOList 创建信息
     */
    void createBatch(@Valid List<SoVslvoyCreateReqVO> createReqVOList);

    /**
     * 批量修改
     *
     * @param updateList 创建信息
     */
    void updateBatch(List<SoVslvoyUpdateReqVO> updateList);

    /**
     * 批量修改
     *
     * @param updateList 创建信息
     */
    void updateBatchDO(List<SoVslvoyDO> updateList);

    /**
     * 更新订舱航次路径
     *
     * @param updateReqVO 更新信息
     */
    void updateSoVslvoy(@Valid SoVslvoyUpdateReqVO updateReqVO);

    /**
     * 查询第一liner航次路径
     *
     * @param soIds soIds
     * @return 订舱航次路径列表
     */
    Map<Long, SoVslvoyDO> selectFirstLinerBySoIdsMap(List<Long> soIds);

    /**
     * 查询第一liner航次路径
     *
     * @param soIds soIds
     * @return 订舱航次路径列表
     */
    List<SoVslvoyDO> selectFirstLinerBySoIds(List<Long> soIds);

    /**
     * 删除订舱航次路径
     *
     * @param id 编号
     */
    void deleteSoVslvoy(Long id);
    /**
     * 删除订舱航次路径soId
     *
     * @param soId 编号
     */
    void deleteSoVslvoyBySoId(Long soId);

    /**
     * 获得订舱航次路径
     *
     * @param id 编号
     * @return 订舱航次路径
     */
    SoVslvoyDO getSoVslvoy(Long id);

    /**
     * 获得订舱航次路径列表
     *
     * @param ids 编号
     * @return 订舱航次路径列表
     */
    List<SoVslvoyDO> getSoVslvoyList(Collection<Long> ids);

    /**
     * 获得订舱航次路径分页
     *
     * @param pageReqVO 分页查询
     * @return 订舱航次路径分页
     */
    PageResult<SoVslvoyDO> getSoVslvoyPage(SoVslvoyPageReqVO pageReqVO);

    /**
     * 通过订舱Ids 删除
     *
     * @param soIds 订舱Ids
     */
    void deleteBySoIds(Collection<Long> soIds);

    /**
     * 通过订舱Id 查询
     *
     * @param soId 订舱Id
     * @return 航程
     */
    List<SoVslvoyDO> seleteBySoId(Long soId);

    /**
     * 通过订舱Id 查询
     *
     * @param soIds 订舱Id
     * @return 航程
     */
    Map<Long, List<SoVslvoyDO>> seleteBySoIdsMap(List<Long> soIds);

    /**
     * 通过订舱Id 查询
     *
     * @param soIds 订舱Id
     * @param spaceStatusList 批舱状态表
     * @return 航程
     */
    Map<Long, List<SoVslvoyDO>> seleteBySoIdsMap(List<Long> soIds, String[] spaceStatusList);

    /**
     * 通过订舱Id 更新默认状态
     *
     * @param soIds 订舱Id
     */
    void submitDraftSetDefault(List<Long> soIds);

    /**
     * 通过订舱Id 更新默
     *
     * @param ids 订舱Id
     */
    void setAllocationIdNull(Collection<Long> ids);

    /**
     * 查询满足自动批舱列表
     *
     * @return 船名航次列表
     */
    List<SoVslvoyApproveSpaceVO> selectByAutoApproveSpace();

}
